package cn.jbolt.core.service;

import cn.jbolt.core.base.JBoltMsg;
import cn.jbolt.core.common.enums.JBoltSystemLogTargetType;
import cn.jbolt.core.kit.JBoltUserKit;
import cn.jbolt.core.model.DictionaryType;
import cn.jbolt.core.service.base.JBoltBaseService;
import com.jfinal.aop.Inject;
import com.jfinal.kit.Kv;
import com.jfinal.kit.Okv;
import com.jfinal.kit.Ret;

import java.util.List;

/**
 * 字典类型Service
 * @ClassName:  DictionaryTypeService
 * @author: JFinal学院-小木 QQ：909854136
 * @date:   2019年11月9日
 */
public class JBoltDictionaryTypeService extends JBoltBaseService<DictionaryType> {
	protected DictionaryType dao = new DictionaryType().dao();
	@Inject
	protected JBoltDictionaryService jboltDictionaryService;
	@Override
	protected DictionaryType dao() {
		return dao;
	}
	/**
	 * 新增 保存
	 * @param type
	 * @return
	 */
	public Ret save(DictionaryType type) {
		if(type==null||isOk(type.getId())||hasNotOk(type.getName(),type.getModeLevel(),type.getTypeKey())){
			return fail(JBoltMsg.PARAM_ERROR);
		}
		if(existsName(type.getName())){
			return fail("数据分类["+type.getName()+"]已经存在");
		}
		if(exists("type_key",type.getTypeKey())){
			return fail("数据分类标识Key["+type.getTypeKey()+"]已经存在");
		}
		if(type.getEnable()==null){
			type.setEnable(true);
		}
		boolean success=type.save();
		if(success){
			//添加日志
			addSaveSystemLog(type.getId(), JBoltUserKit.getUserId(), type.getName());
		}
		return ret(success);
	}
	/**
	 * 更新
	 * @param type
	 * @return
	 */
	public Ret update(DictionaryType type) {
		if(type==null||hasNotOk(type.getId(),type.getName(),type.getTypeKey())){
			return fail(JBoltMsg.PARAM_ERROR);
		}
		DictionaryType db=findById(type.getId());
		if(db==null) {
			return fail(JBoltMsg.DATA_NOT_EXIST);
		}
		if(db.getIsBuildIn()){
			return fail("内置字典类型，不可修改");
		}
		if(existsName(type.getName(), type.getId())){
			return fail("数据分类["+type.getName()+"]已经存在");
		}
		if(exists("type_key",type.getTypeKey(), type.getId())){
			return fail("数据分类标识Key["+type.getTypeKey()+"]已经存在");
		}
		boolean success=type.update();
		if(success){
			if(db.getTypeKey().equals(type.getTypeKey())==false) {
				//如果修改了typeKey就要去更新一下字典数据表的绑定了
				jboltDictionaryService.updateTypeKey(type.getId(),type.getTypeKey());
			}
			addUpdateSystemLog(type.getId(), JBoltUserKit.getUserId(), type.getName());
		}
		return ret(success);
	}

	/**
	 * 删除字典分类
	 * @param id
	 * @return
	 */
	public Ret delete(Long id) {
		return deleteById(id, true);
	}
	/**
	 *  删除一个分类后额外处理
	 */
	@Override
	protected String afterDelete(DictionaryType type, Kv kv) {
		addDeleteSystemLog(type.getId(), JBoltUserKit.getUserId(), type.getName());
		return null;
	}

	@Override
	protected String afterToggleBoolean(DictionaryType model, String column, Kv kv) {
		if(column.equalsIgnoreCase(DictionaryType.ENABLE)){
			//根据typeId 将下面的所有字典数据enable设置为与type同步
			//这里其实有个问题就是恢复的时候也跟这个修改了
			jboltDictionaryService.changeEnableByTypeId(model.getId(),model.getEnable());
		}
		return null;
	}

	/**
	 * 检测是否可以删除
	 */
	@Override
	public String checkCanDelete(DictionaryType dictionaryType,Kv kv) {
		Boolean isBuildIn = dictionaryType.getIsBuildIn();
		if(isBuildIn!=null && isBuildIn){
			return "系统内置字典类型，不允许删除";
		}
		return checkInUse(dictionaryType,kv);
	}

	@Override
	public String checkCanToggle(DictionaryType dictionaryType, String column, Kv kv) {
		if(column.equals(ENABLE) && dictionaryType.getEnable()){
			Boolean isBuildIn = dictionaryType.getIsBuildIn();
			if(isBuildIn!=null && isBuildIn){
				return "系统内置字典类型，不可禁用";
			}
		}
		return null;
	}

	/**
	 * 检测是否被使用
	 */
	@Override
	public String checkInUse(DictionaryType dictionaryType,Kv kv) {
		boolean inUse=jboltDictionaryService.checkTypeInUse(dictionaryType.getId());
		return inUse?"此类型下已经存在数据项!":null;
	}

	/**
	 * 通过typeKey获取字典分类
	 * @param typeKey
	 * @return
	 */
	public DictionaryType findByTypeKey(String typeKey) {
		return findFirst(Okv.by("type_key", typeKey));
	}
	@Override
	protected int systemLogTargetType() {
		return JBoltSystemLogTargetType.DICTIONARY_TYPE.getValue();
	}

	public List<DictionaryType> getEnablApiDatas() {
		return find(selectSql().enableEq(true).select(DictionaryType.ID,DictionaryType.NAME,DictionaryType.TYPE_KEY,DictionaryType.MODE_LEVEL,DictionaryType.IS_BUILD_IN));
	}
}
